package com.atguigu.java.ai.langchain4j.assistant;

import dev.langchain4j.service.MemoryId;
import dev.langchain4j.service.SystemMessage;
import dev.langchain4j.service.UserMessage;
import dev.langchain4j.service.V;
import dev.langchain4j.service.spring.AiService;

import static dev.langchain4j.service.spring.AiServiceWiringMode.EXPLICIT;

/**
 * @Author 杨轲
 * @Date 2025/5/9 13:55
 * @Version 1.0
 * @description:
 * 隔离记忆，为每个不同的用户创建不同的用户分区记忆隔离
 *  chatMemoryProvider = "separateChatMemory"
 * SeparateMemoryChatAssistantConfig 中的separateChatMemory方法实现聊天记忆 聊天持久化操作
 * 大语言模型不擅长数学计算，我于是用tool工具实现数学计算 方法名要取对好让大模型自动调用 工具在tools包里面 CalculatoTools
 */
@AiService(
        wiringMode = EXPLICIT,
        chatModel = "qwenChatModel",
        chatMemoryProvider = "separateChatMemory",
        tools = "calculatorTools"  //配置工具 bean对象为小写
)
public interface SeparateChatMemoryAssistant {


    //@SystemMessage("我们是好朋友，请用四川话回答问题") //系统消息提示语，那么ai回答就用了东北话
    //@SystemMessage("我们是好朋友，请用四川话回答问题,今天是{{current_date}}")
    @SystemMessage(fromResource = "my-prompt-template.txt")  //直接把很多的提示词写到文档里面
    String chat(@MemoryId int memoryId, @UserMessage String userMessage);

    //多个参数
    @SystemMessage("我们是好朋友，请用东北话回答问题 {{message}}")  //直接把很多的提示词写到文档里面
    String chat2(@MemoryId int memoryId,@V("message") @UserMessage String userMessage);

    //多个参数多个注解联合使用
    @SystemMessage(fromResource = "my-prompt-template3.txt")  //直接把很多的提示词写到文档里面
    String chat3(
            @MemoryId int memoryId,
            @UserMessage String userMessage,
            @V("username") String userName,
            @V("age") int age
    );
}
